

// 数据类型
// 基本数据类型
console.log(typeof 123);  // "number"
console.log(typeof "gaivn"); // "string"
console.log(typeof true);    // "boolean"
console.log(typeof null);      // "object"
console.log(typeof undefined); // "undefined"

// 复合数据类型
console.log(typeof []);        // "object"
console.log(typeof {});        // "object"
console.log(typeof new Number()); // "object"
console.log(typeof Math.abs);  // "function"

console.log([] instanceof Array);
console.log({} instanceof Object);

// 对象有方法和属性
var name = "test";

console.log("The length of %s: %d", name, name.length);
console.log("The upper case of %s: %s", name, name.toUpperCase());


// 数据类型转换
var age = 25;
var text = "hello!";

console.log(text + age); // 隐式
console.log(typeof String(age)); // 显式转换为string

// 强制类型转换
// 转为数字
console.log(Number(324));   // 324
console.log(Number('324')); // 324
console.log(Number('324xx'));// NaN
console.log(Number(''));    // 0
console.log(Number(true));  // 1
console.log(Number(false)); // 0
console.log(Number(undefined)); // NaN
console.log(Number(null));    // 0

parseInt('324xx');    // 0
console.log(Number('324xx'));// NaN

// 转为字符串
console.log(String(123));    "123"
console.log(String('abc'));  "abc"
console.log(String(true));   "tru"
console.log(String(undefined)); "undefined"
console.log(String(true));   "true"

// 转换为布尔值
// 以下5个值被转为false，其他均为true
console.log(Boolean(0));   // false
console.log(Boolean(NaN)); // false
console.log(Boolean(''));  // false
console.log(Boolean(null));// false
console.log(Boolean(undefined));// false

// 自动转为布尔
if ('abc') console.log('abc');

// 自动转为字符串
// 除了+加法运算符，有可能把运算子转为字符串
// 这种转换非常容易出错
console.log('5' + 2); // '52'
console.log('5' + true); // "5true"
console.log('5' + false); // "5false"
console.log('5' + {}); // "5[object Object]"
console.log('5' + []) // "5"
console.log('5' + function (){}) // "5function (){}"
console.log('5' + undefined) // "5undefined"
console.log('5' + null) // "5null"

// 自动转为数值
// 除了+，其他运算符，都会把运算子自动转成数值
console.log('5' - 2); // 3
console.log('5' * 2); // 10
console.log('5' / 2); // 2.5


